package com.kaikeba.service;

import com.kaikeba.bean.Express;
import com.kaikeba.dao.BaseExpressDao;
import com.kaikeba.dao.impl.ExpressDaoMysql;
import com.kaikeba.exception.DuplicateCodeException;
import com.kaikeba.util.RandomUtil;

import java.util.List;
import java.util.Map;

/**
 * @description:
 * @author: ManolinCoder
 * @time: 2021/8/31
 */
public class ExpressService {
    private static BaseExpressDao dao = new ExpressDaoMysql();
    /**
     * @return [{size:总数,day:新增},{size:总数,day:新增}]
     * @Author LC
     * @Description //TODO 用于查询数据库中的全部快递（总数+新增）和待取件快递（总数+新增）
     * @Date 19:59 2021/8/30
     * @Param
     **/

    public static List<Map<String, Integer>> console() {

        return dao.console();
    }

    /**
     * @param limit
     * @param offset
     * @param pageNumber
     * @return 快递的集合
     * @Author LC
     * @Description //TODO 用于查询所有快递
     * @Date 20:02 2021/8/30
     * @Param [limit 是否分页的标记，true表示分页。false表示查询所有快递, offset SQL语句的起始索引, pageNumber 每一页查询的数量]
     */
    public static List<Express> findAll(boolean limit, int offset, int pageNumber) {
        return dao.findAll(limit, offset, pageNumber);
    }

    /**
     * @param number
     * @return 查询的快递信息，单号不存在时返回null
     * @Author LC
     * @Description //TODO 根据快递单号，查询快递信息
     * @Date 20:11 2021/8/30
     * @Param [number 单号]
     */
    public static Express findByNumber(String number) {
        return dao.findByNumber(number);
    }

    /**
     * @param id
     * @return 查询的快递信息，id不存在时返回null
     * @Author LC
     * @Description //TODO 根据快递id，查询快递信息
     * @Date 19:19 2021/9/12
     * @Param [id 快递的唯一标识]
     */
    public static Express findById(int id) {
        return dao.findById(id);
    }

    /**
     * @param code
     * @return 查询的快递信息，取件码不存在时返回null
     * @Author LC
     * @Description //TODO 根据快递取件码，查询快递信息
     * @Date 20:11 2021/8/30
     * @Param [code 取件码]
     */
    public static Express findByCode(String code) {
        return dao.findByCode(code);
    }

    /**
     * @param userPhone
     * @return 查询的快递信息列表
     * @Author LC
     * @Description //TODO 根据用户的手机号码，查询他所有的快递信息
     * @Date 20:11 2021/8/30
     * @Param [userPhone 手机号码]
     */
    public static List<Express> findByUserPhone(String userPhone) {
        return dao.findByUserPhone(userPhone);
    }

    /**
     * @param number
     * @param userPhone
     * @param sysPhone
     * @return 查询的快递信息
     * @Author LC
     * @Description //TODO 根据单号和用户的手机号码或录入人的电话号码，查询快递信息
     * @Date 14:09 2021/9/14
     * @Param [number 快递单号, userPhone 用户的手机号, sysPhone 录入人的电话号码]
     */
    public static Express findByNumberAndPhone(String number, String userPhone, String sysPhone) {
        return dao.findByNumberAndPhone(number, userPhone, sysPhone);
    }

    /**
     * @param userPhone
     * @param status
     * @return 查询的快递信息列表
     * @Author LC
     * @Description //TODO 根据用户的手机号码和快递的status，查询他相应status的快递信息
     * @Date 20:11 2021/8/30
     * @Param [userPhone 手机号码,status 快递状态码]
     */
    public static List<Express> findByUserPhoneAndStatus(String userPhone, int status) {
        return dao.findByUserPhoneAndStatus(userPhone, status);
    }

    /**
     * @param sysPhone
     * @return 查询的快递信息列表
     * @Author LC
     * @Description //TODO 根据录入人的手机号码，查询录入的所有记录
     * @Date 20:11 2021/8/30
     * @Param [sysPhone 手机号码]
     */
    public static List<Express> findBySysPhone(String sysPhone) {
        return dao.findBySysPhone(sysPhone);
    }

    /**
     * @param e
     * @return 录入的结果, true表示成功, false表示失败
     * @Author LC
     * @Description //TODO 快递的录入
     * @Date 20:19 2021/8/30
     * @Param [e 要录入的快递对象]
     */
    public static boolean insert(Express e){
        //1.生成取件码
        e.setCode(RandomUtil.getCode()+"");
        try {
            boolean flag = dao.insert(e);
            if (flag){
                //录入成功,发送验证码(短信用不了发到控制台)
                System.out.println("快递信息录入成功，取件码为:"+e.getCode());
            }
            return flag;
        } catch (DuplicateCodeException duplicateCodeException) {
            //2.出异常（取件码重复）再次生成取件码
           return insert(e);
        }
    }

    /**
     * @param id
     * @param newExpress
     * @return 修改的结果，true表示成功，false表示失败
     * @Author LC
     * @Description //TODO 快递的修改，用于后台管理端修改
     * @Date 20:22 2021/8/30
     * @Param [id 要修改额快递id, newExpress 新的快递对象(number,company,username,userPhone)]
     */
    public static boolean update(int id, Express newExpress) {
        if (newExpress.getUserPhone()!=null){
            //用户修改了手机号后要重新发送新的取件码，所以我们选择删除之前的所有信息再重新插入
            //注意这里不能调用dao.insert()因为其中没有生成取件码的代码，要走service层的insert()
            //注意在删除前传入sysPhone，否则会为null
            newExpress.setSysPhone(dao.findById(id).getSysPhone());
            dao.delete(id);
            return insert(newExpress);
        }else {
            Express express = dao.findById(id);
            newExpress.setUserPhone(express.getUserPhone());
            boolean update = dao.update(id, newExpress);
            Express e = dao.findByNumber(newExpress.getNumber());
            if (newExpress.getStatus() == 1){
                updateStatus(e.getCode());
            }
            return update;
        }
    }

    /**
     * @Author LC
     * @Description //TODO 快递的修改（包括已取件快递的信息），用于wx端修改
     * @Date 19:25 2021/9/11
     * @Param [newExpress 新的快递对象(number,company,username,userPhone)]
     * @return boolean
     **/
    public static boolean update(Express newExpress){
        //不需要判断快递号码是否有变化，因为不需要重新生成验证码
        boolean update = dao.update(newExpress.getId(),newExpress);
        return update;
    }

    /**
     * @param code
     * @return 修改的结果，true表示成功，false表示失败
     * @Author LC
     * @Description //TODO 更改快递的状态为1,表示取件完成
     * @Date 20:26 2021/8/30
     * @Param [code 要修改的快递的取件码]
     */
    public static boolean updateStatus(String code) {
        return dao.updateStatus(code);
    }

    /**
     * @param id
     * @return 删除的结果，true表示成功，false表示失败
     * @Author LC
     * @Description //TODO 根据id，删除单个快递信息
     * @Date 20:27 2021/8/30
     * @Param [id 要删除的快递id]
     */
    public static boolean delete(int id) {
        return dao.delete(id);
    }
}
